home *** CD-ROM | disk | FTP | other *** search
/ 9-Digit Zip Code Directory / 9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO / z4src.zip / Z4ZXEXTR.C < prev    next >
C/C++ Source or Header  |  1995-07-29  |  8KB  |  297 lines

  1. //----------------------------------------------------------------------------
  2. //                            MODULE DESCRIPTION
  3. //
  4. //  Module:    z4zxextr.c
  5. //   Title:    9-Digit ZIP Code Directory -- on CD-ROM
  6. //  Notice:    John M. Weeder
  7. //                 Copyright (c) 1993. All rights reserved.
  8. //             This module contains proprietary information and should be 
  9. //                treated as confidential.
  10. //
  11. //----------------------------------------------------------------------------
  12. //                           MAINTENANCE HISTORY
  13. //
  14. // $Workfile$
  15. // $Revision$
  16. //   $Author$
  17. //     $Date$
  18. //      $Log$    
  19. //
  20. //----------------------------------------------------------------------------
  21. //                             MODULE NARRATIVE
  22. //
  23. //    This module contains the program entry point for
  24. //
  25. //    The code in this module may be written in C++ or C.
  26. //
  27. //    This module is portable to:
  28. //        DOS 3.X+
  29. //        MS Windows 3.X+
  30. //        OS/2 2.X+
  31. //        OS/2 2.0 PM
  32. //
  33. //    The following compilers are supported:
  34. //        MSC 6.0A
  35. //        MSC/C++ 7.0
  36. //        Borland C++ 3.1 for DOS
  37. //        Borland C++ 1.0 for OS/2 2.X
  38. //
  39. //----------------------------------------------------------------------------
  40. #include <z4.h>
  41.  
  42.  
  43. //----------------------------------------------------------------------------
  44. //    Stack size
  45. //----------------------------------------------------------------------------
  46. #if COMPILER_BORLAND && (OS_DOS || OS_WINDOWS)
  47. unsigned _stklen = 0x4000;
  48. #endif
  49.  
  50.  
  51. //----------------------------------------------------------------------------
  52. //    Globals
  53. //----------------------------------------------------------------------------
  54. #if OS_UNIX
  55. #define MAX_ZX_BUF        (100000)
  56. #else
  57. #define MAX_ZX_BUF        (1000)
  58. #endif
  59.  
  60. //
  61. // A useless string which is simply embedded in the executable.
  62. //
  63. PSZ __pszCredits__ = "Written by John M Weeder, 1993";
  64.  
  65.  
  66. //
  67. //    This should contain a program description which will be displayed as
  68. //    part of the program's help text.
  69. //
  70. static PCSZ pcszDescription =
  71.     "This program extracts unique ZIP+4 records from the ZIP+4 data file.";
  72.  
  73. //
  74. //    Program command line options
  75. //
  76. static BOOL fSuppress = FALSE;
  77. static LONG lBlock = 0;
  78. static CHAR szInput[MAX_PATH] = "z4.db";
  79. static CHAR szOutput[MAX_PATH] = "z4zx.inp";
  80. static BS_CMDOPT acmdopt[] =
  81.     {
  82.     { "SUPPRESS",     (PVOID)&fSuppress,    CMDOPT_TRUE,              "Suppress writing output."},
  83.     { "BLOCK",         (PVOID)&lBlock,         CMDOPT_NUMERIC,        "Start at specified block."},
  84.     { "input",         (PVOID)szInput,        CMDOPT_FILESPEC(80), "Input file specification."},
  85.     { "output",     (PVOID)szOutput,        CMDOPT_FILESPEC(80), "Output file specification."},
  86.     BS_CMDOPT_NULL,
  87.     };
  88.  
  89.  
  90. //----------------------------------------------------------------------------
  91. //   Description:    main() - Program entry point
  92. //    Parameters:    Standard C parameters
  93. //       Returns:    DOS return code.
  94. //----------------------------------------------------------------------------
  95. BOOL FN Write(PZ4_Z4 z4)
  96. {
  97. static CHAR szFormat[1024];
  98.  
  99.     PCSZ pszRecType = Z4Z4RecordType(z4->rectype, Z4_DATA_ABBREV);
  100.  
  101.     sprintf(szFormat,
  102.         "%-30.30s  %-4s %-6s - %6s %*s** %s **\r\n"
  103.         "%-10s (%2d) - %-10s (%2d) %-2s %-20s (%-4s) %-4s %-2s\r\n"
  104.         "%s %-4s - %-4s\r\n\r\n",
  105.         z4->szSecName,
  106.         Z4Unit(z4->unit, Z4_DATA_ABBREV),
  107.         z4->szSecLo,
  108.         z4->szSecHi,
  109.         20 - strlen(pszRecType), "",
  110.         pszRecType,
  111.         z4->szPriLo, strlen(z4->szPriLo),
  112.         z4->szPriHi, strlen(z4->szPriHi),
  113.         Z4Directional(z4->predir, Z4_DATA_ABBREV),
  114.         z4->szPriName,
  115.         Z4SuffixAbbrev(z4->suffix2),
  116.         Z4SuffixAbbrev(z4->suffix1),
  117.         Z4Directional(z4->postdir, Z4_DATA_ABBREV),
  118.         z4->szZip5,
  119.         z4->szAddonHi,
  120.         z4->szAddonLo);
  121.     Output(szFormat);
  122.     return TRUE;
  123. }
  124.  
  125.  
  126. //----------------------------------------------------------------------------
  127. //   Description:    main() - Program entry point
  128. //    Parameters:    Standard C parameters
  129. //       Returns:    DOS return code.
  130. //----------------------------------------------------------------------------
  131. int main(int argc, char **argv)
  132. {
  133. static BS_CFG cfg = CFG_DFT;
  134.     int retval = 99;
  135.     RECID recid;
  136.     HLF hlf;
  137.     Z4_Z4_BLK z4_z4_blk;
  138.     LONG lBlocks;
  139.     USHORT usBlockSize;
  140.     Z4_Z4 z4_z4;
  141.     Z4_Z4 z4_z4Save;
  142.     HF hfOutput = -1;
  143.     FLAG16 fsOutput = FL_CREATE|FL_TRUNCATE|FL_READWRITE|FL_DENYREADWRITE|FL_BINARY;
  144.     LONG lRecords = 0, lZip4 = 0;
  145.     PBYTE pbBlock, pb, pbBuf = NULL;
  146.     SIZET cRecSize, cBuf;
  147.     BYTE bKey[2][MAX_Z4_KEY];
  148.     SIZET cWhich = 0;
  149.     BOOL fNext = FALSE;
  150.  
  151.     //
  152.     //    Initialize base library
  153.     //
  154.     BaseLibraryInitialize(argc, argv, &cfg);
  155.     BaseTitle("$Revision:  93.1  $", __DATE__, __TIME__, "ZIP+4 Extracter");
  156.     if (!BaseTitleHelp(acmdopt, pcszDescription,NULL))
  157.         return 99;
  158.  
  159.     cRecSize = sizeof(RECID) + MAX_ZIP5_BCD + MAX_ADDON_BCD + MAX_ADDON_BCD;
  160.     if ((pbBuf = MemAlloc(MAX_ZX_BUF * cRecSize)) == NULL)
  161.         {
  162.         ErrorNoMem();
  163.         return 99;
  164.         }
  165.     pb = pbBuf;
  166.     cBuf = 0;
  167.     DioSetDataPath(EnvGet("DATA"));
  168.  
  169.     if (!DioOpenPhysical(szInput, NULL, FALSE)
  170.     || !DioOpenLogical("ZIP4", &hlf, DFT_ISAM_DATA)
  171.     || !Z4Z4ExpandInitialize(&z4_z4_blk)
  172.     || !DioCacheSet(hlf, 1)
  173.     || !DioGetBlockSize(hlf, &usBlockSize)
  174.     || !DioGetBlocks(hlf, &lBlocks))
  175.         goto ERROR_EXIT;
  176.  
  177.     if (!FnameQualify(szOutput, "inp", EnvGet("DATA"), 0))
  178.         return FALSE;
  179.  
  180.     if (!FileOpen(&hfOutput, szOutput, fsOutput, NULL))
  181.         return FALSE;
  182.  
  183. #if OS_DOS
  184.     Output("\nPress escape to abort...\n\n");
  185. #endif
  186.  
  187.     memset(bKey, 0, sizeof(bKey));
  188.     for (recid.lBlock = lBlock; recid.lBlock < lBlocks; recid.lBlock++)
  189.         {
  190. #if OS_DOS
  191.         while (KbdReady())
  192.             if (KbdChar() == '\x1B')
  193.                 {
  194.                 Output("\nAborted!\n");
  195.                 return FALSE;
  196.                 }
  197.         if ((recid.lBlock % 100L) == 0)
  198.             Output("\rBlock %ld / %ld", recid.lBlock, lBlocks);
  199. #else
  200.         if ((recid.lBlock % 100L) == 0)
  201.             Output("Block %ld / %ld\n", recid.lBlock, lBlocks);
  202. #endif
  203.         recid.usOffset = 0L;
  204.         if (!DioSeekBlock(hlf, recid.lBlock)
  205.         || !DioReadBlock(hlf, NULL, &pbBlock, NULL)
  206.         || !Z4Z4ExpandReset(&z4_z4_blk, pbBlock, (SIZET)usBlockSize))
  207.             goto ERROR_EXIT;
  208.  
  209.         for (; Z4Z4Expand(&z4_z4_blk, &z4_z4); recid.usOffset++)
  210.             {                                        // Non-deliverable
  211.             lRecords++;
  212.             if (fNext)
  213.                 {
  214.                 Write(&z4_z4);
  215.                 fNext = FALSE;
  216.                 }
  217.             cWhich = !cWhich;                    // Compare keys
  218.             Z4Z4Key(bKey[cWhich], z4_z4.szFinance, z4_z4.szPriName, z4_z4.szPriLo);
  219.             if (memcmp(bKey[cWhich], bKey[!cWhich], MAX_Z4_KEY) < 0)
  220.                 {
  221.                 SIZET i;
  222.                 CHAR szBuf[40];
  223.  
  224.                 Output("\nInvalid sort sequence at record %ld (%ld,%ld).\n",
  225.                     lRecords, recid.lBlock, (LONG)recid.usOffset);
  226.  
  227.                 szBuf[0] = '\0';
  228.                 for (i = 0; i < MAX_Z4_KEY; ++i)
  229.                     sprintf(strchr(szBuf, '\0'), "%02X", bKey[!cWhich][i]);
  230.                 Output("%s\n", szBuf);
  231.  
  232.                 szBuf[0] = '\0';
  233.                 for (i = 0; i < MAX_Z4_KEY; ++i)
  234.                     sprintf(strchr(szBuf, '\0'), "%02X", bKey[cWhich][i]);
  235.                 Output("%s\n", szBuf);
  236.  
  237.  
  238.                 Write(&z4_z4Save);
  239.                 Write(&z4_z4);
  240.                 fNext = TRUE;
  241.                 }
  242.             z4_z4Save = z4_z4;
  243.  
  244.             if (z4_z4.szAddonLo[0] == 'N'
  245.             || z4_z4.szAddonHi[0] == 'N')
  246.                 continue;
  247.  
  248.             lZip4++;
  249.  
  250.             if (!fSuppress)
  251.                 {
  252.                if (cBuf >= MAX_ZX_BUF)
  253.                    {
  254.                    if (!FileWrite(hfOutput, pbBuf, cBuf * cRecSize, -1L))
  255.                        goto ERROR_EXIT;
  256.    
  257.                    cBuf = 0;
  258.                    pb = pbBuf;
  259.                    }
  260.                *(PRECID)pb = recid;            // Store record id
  261.                 pb += sizeof(RECID);            // Convert to bcd
  262.                stra2b(pb, MAX_ZIP5_BCD, z4_z4.szZip5, MAX_ZIP5);
  263.                pb += MAX_ZIP5_BCD;
  264.                stra2b(pb, MAX_ADDON_BCD, z4_z4.szAddonLo, MAX_ADDON);
  265.                pb += MAX_ADDON_BCD;
  266.                stra2b(pb, MAX_ADDON_BCD, z4_z4.szAddonHi, MAX_ADDON);
  267.                pb += MAX_ADDON_BCD;
  268.                cBuf++;
  269.                 }
  270.             }
  271.         }
  272.     if (cBuf)                                    // Flush buffer
  273.         if (!FileWrite(hfOutput, pbBuf, cBuf * cRecSize, -1L))
  274.             goto ERROR_EXIT;
  275.  
  276.     retval = 0;
  277. #if OS_DOS
  278.     Output("\rBlock %ld / %ld\n%ld Records\n%ld ZIP+4 Records\n",
  279.         recid.lBlock, lBlocks, lRecords, lZip4);
  280. #else
  281.     Output("Block %ld / %ld\n%ld Records\n%ld ZIP+4 Records\n",
  282.         recid.lBlock, lBlocks, lRecords, lZip4);
  283. #endif
  284.  
  285. ERROR_EXIT:
  286.     if (pbBuf != NULL)
  287.         MemFree(pbBuf);
  288.     if (hfOutput >= 0)
  289.         FileClose(hfOutput);
  290.     Z4Z4ExpandTerminate(&z4_z4_blk);
  291.     DioCloseAll();
  292.     return retval;
  293. }
  294. //----------------------------------------------------------------------------
  295. //------------------------------- End of File --------------------------------
  296. //----------------------------------------------------------------------------
  297.